27 research outputs found
Correctness and completeness of logic programs
We discuss proving correctness and completeness of definite clause logic
programs. We propose a method for proving completeness, while for proving
correctness we employ a method which should be well known but is often
neglected. Also, we show how to prove completeness and correctness in the
presence of SLD-tree pruning, and point out that approximate specifications
simplify specifications and proofs.
We compare the proof methods to declarative diagnosis (algorithmic
debugging), showing that approximate specifications eliminate a major drawback
of the latter. We argue that our proof methods reflect natural declarative
thinking about programs, and that they can be used, formally or informally, in
every-day programming.Comment: 29 pages, 2 figures; with editorial modifications, small corrections
and extensions. arXiv admin note: text overlap with arXiv:1411.3015. Overlaps
explained in "Related Work" (p. 21
Implementing backjumping by means of exception handling
We discuss how to implement backjumping (or intelligent backtracking) in
Prolog by using the built-ins throw/1 and catch/3. We show that it is
impossible in a general case, contrary to a claim that ``backjumping is
exception handling". We provide two solutions. One works for binary programs;
in a general case it imposes a restriction on where backjumping may originate.
The other restricts the class of backjump targets. We also discuss implementing
backjumping by using backtracking and the Prolog database. Additionally, we
explain the semantics of Prolog exception handling in the presence of
coroutining.Comment: 14 pages, 2 figures. Accepted for ICLP 2023. A former version of this
paper is arxiv:2008.0961